package juego.modelo;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

import titiritero.Dibujable;

public class MapaFactory {
	private Punto[][] caminos;
	private Comida[][] comidas;
	private Punto[][] paredes;
	private Punto [][] posPuntoComun;
	private Punto posBonus;
	private ArrayList<Punto> posPuntoPoder;
	private int cantidadPuntosComunes;
	private String archivo;
	private int nivel;
	private Punto posicionInicialPacman;
	private Punto posicionInicialFantasmas;
	private int tamanoMapaMaximo=200;
	private int alturaDelLaberinto = 0;
	private int anchoDelLaberinto = 0;
	private Tablero tablero;
	private Bonus bonus;;
	
	public MapaFactory(int nivel) {
		if(nivel<1) throw new IllegalArgumentException();
		archivo = getArchivo(nivel);  
		this.nivel=nivel;
		tablero = Tablero.getInstance();
		comidas=new Comida[tamanoMapaMaximo][tamanoMapaMaximo];
		caminos=new Punto[tamanoMapaMaximo][tamanoMapaMaximo];
		paredes=new Punto[tamanoMapaMaximo][tamanoMapaMaximo];
		posPuntoComun=new Punto[tamanoMapaMaximo][tamanoMapaMaximo];
		posPuntoPoder = new ArrayList<Punto>(10);
		cantidadPuntosComunes = 0;
		try {
			leerMapa(archivo);
		} catch (IOException e) {
			try {
				leerMapa(getArchivo(1));
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
	}

	private String getArchivo(int nivel) {
		
		String numero= String.valueOf(nivel);
		String nombre = "mapa"+numero+".txt";
		return nombre;
	}

	private void leerMapa(String archivo) throws IOException {

		FileReader fr = new FileReader(archivo);
		BufferedReader entrada = new BufferedReader(fr);
		String s;
		int linea = 0;
		while ((s = entrada.readLine()) != null) {
			String aux = "";
			anchoDelLaberinto = s.length();
			for (int i = 0; i < s.length(); i++) {
				Punto punto = new Punto (i, linea);
				aux = s.substring(i, i + 1);
				if (aux.equals("#"))
					paredes [i][linea] = punto;
				else {
					if (aux.equals("*")) {
						comidas[i][linea] = new PuntoComun(nivel,punto);
						posPuntoComun [i][linea] = new Punto (i, linea);
						sumarCantidadPuntosComunes(1);
					}
					if (aux.equals("$")) {
						comidas[i][linea] = new PuntoDePoder(nivel, punto);
						sumarCantidadPuntosComunes(1);
						posPuntoPoder.add(punto);
					}
					if (aux.equals("b")){
						this.bonus = new Bonus(nivel, punto);
						comidas[i][linea] = bonus;
						posBonus = punto;
						BonusActivo ba= new BonusActivo(bonus,nivel);
						Thread t=new Thread(ba); 
						t.start();
					}
					if (aux.equals("p"))
						this.posicionInicialPacman = punto;
					if (aux.equals("f"))
						this.posicionInicialFantasmas = punto;
					caminos[i][linea] = punto;
				}
			}
			linea++;
		}
		alturaDelLaberinto = linea;
		tablero.setTamanoMapa(this.tamanoMapaMaximo);
		tablero.setCaminos(this.caminos);
		tablero.setComidas(this.comidas);
		tablero.setParedes(this.paredes);
		tablero.setPuntosPoder(this.posPuntoPoder);
		tablero.setCantidadPuntosComunes(this.cantidadPuntosComunes);
		tablero.setCantidadFantasmas(this.getCantidadFantasmas());
		tablero.setPosicionInicialPacman(this.posicionInicialPacman);
		tablero.setPosicionInicialFantasma(this.posicionInicialFantasmas);
		
	}

	private void sumarCantidadPuntosComunes(int cantidad) {
		this.cantidadPuntosComunes += cantidad;
	}

	public int getCantidadFantasmas() {
		int numero = 4 + nivel / 2;
		return numero;
	}

	public int getAltura() {
		return alturaDelLaberinto;
	}

	public int getAncho() {
		return anchoDelLaberinto;
	}

	public Punto[][] getPosicionPuntoComun() {

		return this.posPuntoComun;
	}

	public ArrayList<Punto> getPosicionPuntoDePoder() {

		return this.posPuntoPoder;
	}

	public Punto getPosBonus() {
		return this.posBonus;
	}

	public Bonus getBonus() {
		return this.bonus;
	}
}
